package com.tencent.protocol.pay_protocol;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import com.tencent.common.Configure;
import com.tencent.common.RandomStringGenerator;
import com.tencent.common.Signature;

/**
 * @author Javin
 * @date 20170718
 * @企业付款到用户请求参数类
 */
public class TransferPayReqData {
	//每个字段具体的意思请查看API文档
    private String mch_appid = "";//商户账号appid
    private String mchid = "";//商户号
    private String device_info = "";//设备号
    private String nonce_str = "";//随机字符串
    private String sign = "";//签名
    private String partner_trade_no = "";//商户订单号
    private String openid;//用户openid
    private String check_name = "";//校验用户姓名选项
    private String re_user_name = "";//收款用户姓名
    private int amount = 0;//企业付款金额，单位为分 100就是100分==1元
    private String desc = "";//企业付款描述信息
    private String spbill_create_ip = "";//Ip地址
    
    public TransferPayReqData() {}

	/**
     * @param device_info 微信支付分配的终端设备号
     * @param nonce_str 随机字符串，不长于32位
     * @param partner_trade_no 商户订单号，需保持唯一性(只能是字母或者数字，不能包含有符号)
     * @param openid 商户appid下，某用户的openid
     * @param check_name NO_CHECK：不校验真实姓名  FORCE_CHECK：强校验真实姓名
     * @param re_user_name 收款用户真实姓名。 如果check_name设置为FORCE_CHECK，则必填用户真实姓名
     * @param amount 企业付款金额，单位为分 
     * @param desc 企业付款金额，单位为分 
     * @param spbill_create_ip 企业付款金额，单位为分
     */
	public TransferPayReqData(String device_info,
			String nonce_str, String partner_trade_no,
			String openid, String check_name, String re_user_name, int amount,
			String desc, String spbill_create_ip) {
		//微信分配的公众号ID（开通公众号之后可以获取到）
        setMch_appid(Configure.getAppid());
        
      //微信支付分配的商户号ID（开通公众号的微信支付功能之后可以获取到）
        setMchid(Configure.getMchid());
        
		this.device_info = device_info;
		
		//随机字符串，不长于32 位
        setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
		//根据API给的签名规则进行签名
        setSign(Signature.getSign(toMap()));//把签名数据设置到Sign这个属性中
        
		this.partner_trade_no = partner_trade_no;
		this.openid = openid;
		this.check_name = check_name;
		this.re_user_name = re_user_name;
		this.amount = amount;
		this.desc = desc;
		this.spbill_create_ip = spbill_create_ip;
	}
	
	
	public String getMch_appid() {
		return mch_appid;
	}
	public void setMch_appid(String mch_appid) {
		this.mch_appid = mch_appid;
	}
	public String getMchid() {
		return mchid;
	}
	public void setMchid(String mchid) {
		this.mchid = mchid;
	}
	public String getDevice_info() {
		return device_info;
	}
	public void setDevice_info(String device_info) {
		this.device_info = device_info;
	}
	public String getNonce_str() {
		return nonce_str;
	}
	public void setNonce_str(String nonce_str) {
		this.nonce_str = nonce_str;
	}
	public String getSign() {
		return sign;
	}
	public void setSign(String sign) {
		this.sign = sign;
	}
	public String getPartner_trade_no() {
		return partner_trade_no;
	}
	public void setPartner_trade_no(String partner_trade_no) {
		this.partner_trade_no = partner_trade_no;
	}
	public String getOpenid() {
		return openid;
	}
	public void setOpenid(String openid) {
		this.openid = openid;
	}
	public String getCheck_name() {
		return check_name;
	}
	public void setCheck_name(String check_name) {
		this.check_name = check_name;
	}
	public String getRe_user_name() {
		return re_user_name;
	}
	public void setRe_user_name(String re_user_name) {
		this.re_user_name = re_user_name;
	}
	public int getAmount() {
		return amount;
	}
	public void setAmount(int amount) {
		this.amount = amount;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}
	public String getSpbill_create_ip() {
		return spbill_create_ip;
	}
	public void setSpbill_create_ip(String spbill_create_ip) {
		this.spbill_create_ip = spbill_create_ip;
	}
    
    
	 public Map<String,Object> toMap(){
        Map<String,Object> map = new HashMap<String, Object>();
        Field[] fields = this.getClass().getDeclaredFields();
        for (Field field : fields) {
            Object obj;
            try {
                obj = field.get(this);
                if(obj!=null){
                    map.put(field.getName(), obj);
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return map;
    }
    
    
    

}
